package 多线程.多线程同步的5种方法;

import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @主题  使用原子变量实现线程同步
 * @date 2017/9/1.
 * @author 廖述京
 */
/*
需要使用线程同步的根本原因在于对普通变量的操作不是原子的。

那么什么是原子操作呢？原子操作就是指将读取变量值、修改变量值、保存变量值看成一个整体来操作即-这几种行为要么同时完成，
要么都不完成。在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类，使用该类可以简化线程同步。
其中AtomicInteger 表可以用原子方式更新int的值，可用在应用程序中(如以原子方式增加的计数器)，但不能用于替换Integer；
可扩展Number，允许那些处理机遇数字类的工具和实用工具进行统一访问。
 */
public class AtomicInteger_Bank {
    //private int count =0;//账户余额
    private AtomicInteger count=new AtomicInteger(0); //给赋初值

    //存钱
    public  void addMoney(int money){
//        count +=money;
        //使用原子操作(保证读取值、计算、写回这一个整体过程，全部成功或失败)
        count.getAndAdd(money);
        System.out.println(new Date(System.currentTimeMillis()).toLocaleString()+"存进："+money);
    }

    //取钱
    public  void subMoney(int money){
//        if(count-money < 0){
//        System.out.println("账户当前余额："+count.get());
//        System.out.println("账户将取出的钱："+money);
//        System.out.println("账户-100后余额："+(count.get()-money));
        if(count.get()-money < 0){
            System.out.println("余额不足");
            return;
        }
//        count -=money;
        count.getAndAdd(-money); //使用原子操作
        System.out.println(new Date(System.currentTimeMillis()).toLocaleString()+"取出："+money);
    }

    //查询
    public void lookMoney(){
        System.out.println("账户余额："+count.get());
    }
}
